package business;


import java.util.ArrayList;
import java.util.LinkedList;

import modelo.Modelo_de_Tabla;
import modelo.mensajes.MensajeTexto;
import observer.IObservador;
import observer.ISujeto;
import utils.socket.ISocketListener;

public class Centro_de_Mensajes implements ISujeto, ISocketListener {
	private ArrayList<MensajeTexto>     nuevos;
	private ArrayList<MensajeTexto>     eliminados;
	private LinkedList<IObservador> observadores_llegada_msj_nuevos; 
	private LinkedList<IObservador> observadores_elimina_msj_nuevos;
	private LinkedList<IObservador> observadores_llegada_msj_viejos;
	private LinkedList<IObservador> observadores_borrado_msj_viejos;
	
	public Centro_de_Mensajes(){
		observadores_llegada_msj_nuevos = new LinkedList<IObservador>();	
		observadores_elimina_msj_nuevos = new LinkedList<IObservador>();
		observadores_llegada_msj_viejos = new LinkedList<IObservador>();
		observadores_borrado_msj_viejos = new LinkedList<IObservador>();
		
		nuevos 		 = new ArrayList<MensajeTexto>();
		eliminados 	 = new ArrayList<MensajeTexto>();
		
		/* Aca tiene que levantar los mensajes de la BD local */
			
	}
	
	// Va a ser llamado por los threads (clientes) de los sockets
	public synchronized void agregar_mensaje_nuevo(MensajeTexto x){
		nuevos.add(x);
		notif_llegada_de_nuevos_mensajes();
	}

	// Saca de la lista de nuevos
	private synchronized MensajeTexto quitar_mensaje(int i){
		MensajeTexto m = nuevos.get(i); 
		nuevos.remove(i);
		return m;
	}
	
	// Cambia de lista
	public synchronized void cambiar_de_lista(int i){
		MensajeTexto m = quitar_mensaje(i);
		notif_elimina_de_nuevos_mensajes(i);
		eliminados.add(m);
		notif_insercion_de_viejos_mensajes();
	}
	
	// Setea los datos del modelo de tabla (nuevos)
	public void setDatosNuevos(Modelo_de_Tabla modelo) {
		modelo.setDatos(nuevos);
	}
	
	// Setea los datos del modelo de tabla (viejos o "eliminados")
	public void setDatosViejos(Modelo_de_Tabla modelo) {
		modelo.setDatos(eliminados);
	}
	
	public MensajeTexto getMensajeNuevo(int i){
		return nuevos.get(i);
	}

	public MensajeTexto getMensajeViejo(int i){
		return eliminados.get(i);
	}
	
	/* Patron Observer - Sujeto */
		
	@Override
	public void sub_llegada_de_nuevos_mensajes(IObservador o) {
		observadores_llegada_msj_nuevos.add(o);
	}

	@Override
	public void sub_elimina_de_nuevos_mensajes(IObservador o) {
		observadores_elimina_msj_nuevos.add(o);
	}

	@Override
	public void sub_insercion_de_viejos_mensajes(IObservador o) {
		observadores_llegada_msj_viejos.add(o);
	}

	@Override
	public void sub_elimina_de_viejos_mensajes(IObservador o) {
		observadores_borrado_msj_viejos.add(o);
	}

	@Override
	public void notif_llegada_de_nuevos_mensajes() {
		for(IObservador o: observadores_llegada_msj_nuevos){
			o.update_insercion();
		}
	}

	@Override
	public void notif_elimina_de_nuevos_mensajes(int i) {
		for(IObservador o: observadores_llegada_msj_nuevos){
			o.update_quitar(i);
		}
	}

	@Override
	public void notif_insercion_de_viejos_mensajes() {
		for(IObservador o: observadores_llegada_msj_nuevos){
			o.update_insercion();
		}
	}

	@Override
	public void notif_elimina_de_viejos_mensajes(int i) {
		for(IObservador o: observadores_llegada_msj_nuevos){
			o.update_quitar(i);
		}
	}

	public void agregar_mensaje(MensajeTexto m) {
		agregar_mensaje_nuevo(m);
	}

}
